#ifndef MAINFACE_H
#define MAINFACE_H

#include <QWidget>

#include <QMessageBox>
#include <QTcpSocket>
#include <QJsonDocument>
#include <QJsonObject>
#include <QString>
#include <QByteArray>
#include "define.h"
#include "networkmanager.h"
#include "teacherterminal.h"


class MFHandleServerClass;
using MFHandleServerptr = std::shared_ptr<MFHandleServerClass>;     // 智能指针
MFHandleServerptr GetHandlePtr(const int &type);      // 函数原型（简单工厂）

namespace Ui {
class Mainface;
}

struct WidgetPrivate;

class Mainface : public QWidget
{
    Q_OBJECT

public:
    explicit Mainface(QWidget *parent = nullptr,NetworkManager *networkManager = nullptr);
    ~Mainface();

signals:
    void LoginBtnClicked();    // 注册按钮点击信号
    void ReginBtnClicked();    // 登录按钮点击信号
    void ReginSuccess();       // 登录成功的信号

private slots:
    void onLogButtonClicked();      // 注册按钮点击的槽函数
    void onResButtonClicked();      // 登录按钮点击的槽函数

    void readServerResponse();      // 读取服务器响应

private:
    Ui::Mainface *ui;
    QTcpSocket* socket;                 // 用于与服务器通信的套接字

    QByteArray buffer;                  // 缓冲区

    MFHandleServerptr handle;   // 具体要处理的事情 (见下面)

    NetworkManager *networkManager;
};


class MFHandleServerClass
{
public:
    virtual void MFHandle(QJsonObject responce,Mainface* mainface) = 0;
};

#define RegisterClass(Name) \
class Name:public MFHandleServerClass \
{ \
public: \
    void MFHandle(QJsonObject responce,Mainface *mainface)override; \
};

RegisterClass(LOGINSUCCESS);    // 注册成功
RegisterClass(LOGINERROR);      // 注册失败
RegisterClass(REGISSUCCESS);    // 登录成功
RegisterClass(REGISERROE);      // 登录失败


#endif // MAINFACE_H
